package com.itheima.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import java.util.Arrays;
import java.util.List;

/**
 * Spring Security 全局安全配置类
 * <p>
 * 用于配置 Web 安全策略，包括：
 * - 启用 CORS 跨域资源共享
 * - 禁用 CSRF（适用于前后端分离项目）
 * - 开放所有请求权限（仅限开发环境使用）
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 使用 SLF4J 日志框架记录日志信息
    private static final Logger logger = LoggerFactory.getLogger(SecurityConfig.class);

    /**
     * 配置安全过滤链（SecurityFilterChain）
     * <p>
     * 定义了全局的安全策略，包括跨域请求支持、CSRF 设置以及请求访问控制。
     *
     * @param http HttpSecurity 对象，用于构建安全策略
     * @return 构建完成的安全过滤链 SecurityFilterChain 实例
     * @throws Exception 如果配置过程中发生异常
     */
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        logger.info("【Security配置】正在初始化安全过滤链...");

        http
                // 启用 CORS 支持，并指定自定义的 CORS 配置源
                .cors(cors -> cors.configurationSource(corsConfigurationSource()))
                // 禁用 CSRF 保护机制（适用于前后端分离架构）
                .csrf(AbstractHttpConfigurer::disable)
                // 配置请求授权规则：所有请求都允许访问
                .authorizeHttpRequests(auth -> auth
                        .anyRequest().permitAll() // 所有请求无需认证即可访问
                );
        return http.build();
    }

    /**
     * 配置 CORS 跨域资源共享策略
     * <p>
     * 定义哪些来源（Origin）、方法（Method）、头部（Header）等可以跨域访问资源，
     * 并注册到 UrlBasedCorsConfigurationSource 中，供 Spring 使用。
     *
     * @return CorsConfigurationSource 实例，包含完整的 CORS 配置
     */
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        logger.info("【CORS配置】正在初始化跨域资源共享策略...");

        CorsConfiguration configuration = new CorsConfiguration();
        // 允许的跨域来源（前端地址）
        configuration.setAllowedOrigins(List.of("http://116.62.234.89:8020"));
        // 允许的 HTTP 方法
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        // 允许的请求头
        configuration.setAllowedHeaders(List.of("*"));
        // 是否允许携带凭证（如 Cookie）
        configuration.setAllowCredentials(true);
        // 创建基于 URL 的配置源
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对所有路径应用该 CORS 配置
        source.registerCorsConfiguration("/**", configuration);

        logger.info("【CORS配置】已设置允许来源: {}", configuration.getAllowedOrigins());
        logger.info("【CORS配置】已设置允许方法: {}", configuration.getAllowedMethods());
        logger.info("【CORS配置】已设置允许头部: {}", configuration.getAllowedHeaders());
        logger.info("【CORS配置】已设置允许凭证: {}", configuration.getAllowCredentials());

        return source;
    }
}
